/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.marcelo.agro.productos.util;

import java.io.File;
import org.marcelo.agro.core.GlobalContext;
import org.marcelo.agro.core.api.IProductos;
import org.openide.modules.InstalledFileLocator;
import org.openide.modules.ModuleInstall;
import org.openide.util.Lookup;

public class Installer extends ModuleInstall {
    
    private static String PATH_ROOT = "productos";
    private static String PATH_PRODUCTOS = "productos.csv";
    private static String PATH_GRUPOS = "grupos.csv";
    private static String PATH_TIPO_PRODUCTOS = "tipoProductos.csv";
    private static String PATH_TIPO_PRESENTACION = "tipoPresentaciones.csv";
    private static String PATH_REGISTRANTES = "registrantes.csv";
    private static String PATH_FABRICANTES = "fabricantes.csv";
    private static String PATH_UNIDAD_MEDIDA_DOSIS = "unidadMedidaDosis.csv";
    private static String PATH_INGREDIENTES = "ingredientes.csv";
    
    private static String PATH_TIPO_ACTIVIDAD_X_TIPO_PRODUCTO = "tipoActividadXtipoProducto.csv";
    private static String PATH_PAISES = "paises.csv";
    private static String CODE_BASE = "org.marcelo.agro.productos.util";
    //Nombre de tablas
    private static String TABLA_GRUPO = "GRUPO";
    private static String TABLA_PAISES = "PAIS";
    private static String TABLA_FABRICANTE = "FABRICANTE";
    private static String TABLA_REGISTRANTE = "REGISTRANTE";
    private static String TABLA_PRODUCTOS = "PRODUCTOS";
    private static String TABLA_TIPO_PRESENTACIONES = "TIPO_PRESENTACION";
    private static String TABLA_TIPO_PRODUCTOS = "TIPO_PRODUCTO";
    private static String TABLA_TIPO_ACTIVIDAD_X_TIPO_PRODUCTO= "TIPO_ACTIVIDAD_X_TIPO_PRODUCTO";
    private static String TABLA_UNIDAD_MEDIDA_DOSIS = "UNIDAD_MEDIDA_DOSIS";
    
    //Tamanho basicos de las tablas
    private static Integer GRUPO_SIZE = 165;
    private static Integer PRODUCTO_SIZE = 1572;
    private static Integer FABRICANTES_SIZE = 14;
    private static Integer REGISTRANTES_SIZE = 85;
    private static Integer PAISES_SIZE = 31;
    private static Integer TIPO_PRESENTACIONES_SIZE = 29;
    private static Integer TIPO_PRODUCTOS_SIZE = 43;
    
    private static IProductos ip;
    private Integer TIPO_ACTIVIDAD_SIZE = 5;
    private Integer TIPO_ACTIVIDAD_X_TIPO_PRODUCTOS_SIZE = 83;
    private Integer UNIDAD_MEDIDA_DOSIS_SIZE = 5;

    @Override
    public void restored() {
        // TODO
        super.restored();
        GlobalContext.getInstance().Logger().println("Iniciando Productos: ");
        ip = Lookup.getDefault().lookup(IProductos.class);
        checkPaises();
        checkGrupo();
        checkFabricantes();
        checkRegistrantes();
        checkTipoPresentaciones();
        checkIngredientesActivos();
        checkProductos();
        checkTipoProducto();
        checkTipoActividad();
        checkAsociaciones();
        
    }
    
    private void checkGrupo(){
        Integer size = ip.getGrupos().size();
        if (size  < GRUPO_SIZE ){
            //Posiblemente los datos no estan inicializados
            guardarATabla(TABLA_GRUPO, PATH_GRUPOS);
        }
    }
    private void checkIngredientesActivos(){
    
    }
    private void checkProductos(){
        Integer size = ip.getAll().size();
        if (size < PRODUCTO_SIZE) {
            guardarATabla(TABLA_PRODUCTOS, PATH_PRODUCTOS);
        }
        else {
            
        }
    }
    
    private void checkTipoPresentaciones(){
        Integer size = ip.getTipoPresentaciones().size();
        if (size < TIPO_PRESENTACIONES_SIZE) {
            guardarATabla(TABLA_TIPO_PRESENTACIONES, PATH_TIPO_PRESENTACION);
        }
    }
    
    private void checkTipoProducto(){
        Integer size = ip.getTiposProductos().size();
        if (size < TIPO_PRODUCTOS_SIZE) {
            guardarATabla(TABLA_TIPO_PRODUCTOS, PATH_TIPO_PRODUCTOS);
        }
    }
    
    /**
     * Metodo para poder guardar el archivo CSV a una tabla
     * @param tabla
     * @param archivo 
     */
    private void guardarATabla(String tabla, String  pathArchivo){
        String ruta = PATH_ROOT + "/" + pathArchivo;
        File archivo =  InstalledFileLocator.getDefault().locate(ruta, CODE_BASE, true);
        try{
            ip.saveCsvToTable(tabla, archivo);
        }
        catch (Exception e){
            //No se pudo guardar por:
            System.out.println("=======================================");
            System.out.println("Se produjo errores en guardar a tabla");
            System.out.println(e);
            System.out.println("=======================================");
        }
    }

    private void checkRegistrantes() {
      Integer size = ip.getRegistrantes().size();
      if (size < REGISTRANTES_SIZE) {
          guardarATabla(TABLA_REGISTRANTE, PATH_REGISTRANTES);
      }
    }

    private void checkFabricantes() {
        Integer size = ip.getFabricantes().size() ;
        if (size < FABRICANTES_SIZE) {
            guardarATabla(TABLA_FABRICANTE, PATH_FABRICANTES);
        }
    }

    private void checkAsociaciones() {
        //Verificar la asociaciones de las tablas
        Integer size = ip.getTipoProductosPorActividad().size();
        if (size < TIPO_ACTIVIDAD_X_TIPO_PRODUCTOS_SIZE)
            guardarATabla(TABLA_TIPO_ACTIVIDAD_X_TIPO_PRODUCTO, PATH_TIPO_ACTIVIDAD_X_TIPO_PRODUCTO);
        size = ip.getUnidadMedidaDosis().size();
        if (size < UNIDAD_MEDIDA_DOSIS_SIZE) {
            guardarATabla(TABLA_UNIDAD_MEDIDA_DOSIS, PATH_UNIDAD_MEDIDA_DOSIS);
        }
    }

    private void checkPaises() {
       Integer size =  ip.getPaises().size();
       if (size < PAISES_SIZE) {
           GlobalContext.getInstance().Logger().println("Chequeando paises: ");
           guardarATabla(TABLA_PAISES, PATH_PAISES);
       }
    }
    
    private void backupTabla(String nombreTabla, String nombreArchivo){
        //Solo para hacer un backup
            File productos = new File(nombreArchivo);
            try{
                ip.saveTableToCSV(nombreTabla, productos);
            }
            catch(Exception e){
                GlobalContext.getInstance().Logger().println("=======================================");
                GlobalContext.getInstance().Logger().println("Se produjo errores en guardar a tabla");
                GlobalContext.getInstance().Logger().println(e);
                GlobalContext.getInstance().Logger().println("=======================================");
            }
    }
    
    private String TABLA_TIPO_ACTIVIDAD = "TIPO_ACTIVIDAD";
    private String PATH_TIPO_ACTIVIDAD = "tipoActividad.csv";
    private void checkTipoActividad() {
        Integer size = ip.getTiposActividades().size();
        if (size < TIPO_ACTIVIDAD_SIZE){
            guardarATabla( TABLA_TIPO_ACTIVIDAD, PATH_TIPO_ACTIVIDAD);
        }
    }
}
